import "reflect-metadata";

interface ControllerOptions {
  prefix?: string;
}

// 类装饰器
// 路径前缀： 可以为空串/也可以非空字符串/也可以写成一个对象（{prefix: 'xxx'}）
// 函数重载
export function Controller(): ClassDecorator; // 空串
export function Controller(prefix: string): ClassDecorator; // 路径前缀
export function Controller(options: ControllerOptions): ClassDecorator; // 对象 {prefix: 'xxx'}
export function Controller(
  prefixOrOptions?: string | ControllerOptions
): ClassDecorator {
  console.log("Controller 装饰器(类装饰器)");
  // 兼容三种传入参数，统一处理成 {prefix: string} 对象形式
  let options: ControllerOptions = {};
  if (typeof prefixOrOptions === "string") {
    options.prefix = prefixOrOptions;
  } else if (typeof prefixOrOptions === "object") {
    options = prefixOrOptions;
  }
  // 这是一个类装饰器，装饰的控制器这个类
  return (target: Function) => {
    console.log("Controller 装饰器 装饰的对象 => ", target, "\n");
    // 控制器这个类 target 身上添加了一个元数据，元数据的属性名是 prefix ，属性值是 options.prefix（路径前缀）
    Reflect.defineMetadata("prefix", options.prefix || "", target);
  };
}
